package Syn;

/**
 * @author 王艺锡
 * @version 1.0
 */
//使用线程同步机制，解决超卖现象
public class SellTicket {
    public static void main(String[] args) {

        ST02 st02 = new ST02();
        new Thread(st02).start();
        new Thread(st02).start();
        new Thread(st02).start();
    }
}

//使用synchronized实现线程同步
//同步方法如果没有static修饰:默认对象为this
//同步方法如果使用static修饰:默认对象为:当前类.class
//要求多线程的锁的对象一定要是同一个对象!
class ST02 implements Runnable {
    public static int ticketcount = 100;

    private boolean flag = true;
    @Override
    public void run() {
        while (flag) {
            sell();
        }
    }

   /* public synchronized void sell() {//同步方法，在同一时刻，只能有一个线程来执行sell方法
        if (ticketcount <= 0) {
            System.out.println("售票结束...");
            flag = false;
            return ;
        }

        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("窗口" + Thread.currentThread().getName() +
                "售出一张票,剩余票数:" + --ticketcount);

    }*/

    public void sell() {//锁代码块
        synchronized(this){
            if (ticketcount <= 0) {
                System.out.println("售票结束...");
                flag = false;
                return ;
            }

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("窗口" + Thread.currentThread().getName() +
                    "售出一张票,剩余票数:" + --ticketcount);
        }

    }

    //同步方法(静态的)锁为当前类本身
    // public static void f1(){}锁是加在ST02.class上的
    public static void f1(){
        synchronized (ST02.class){
            System.out.println("f1方法");
        }

    }
}
